<template> <!-- 页面头部 --> <HomePageHead></HomePageHead> <!-- 页面导航 --> <HomePageNavigation></HomePageNavigation> <!-- 广告1 --> <HomeAdvertising :imgurl="adImg1"></HomeAdvertising> <!-- 面包屑导航 --> <PublicBreadcrumb :articleName="newsDetail.title"></PublicBreadcrumb> <!-- 资讯列表 --> <div class="newsDetail"> <div class="inner"> <div class="innerLeft"> <div class="LeftTop"> <h1>{{ newsDetail.title }}</h1> <p> 来源: <span>{{ newsDetail.copyfrom }}</span> 作者: <span>{{ newsDetail.author }}</span> 发布时间: <span>{{ time }}</span> </p> </div> <div class="leftBottom" v-html="newsDetail.content" v-if="newsDetail.content" @click="openPreview"> </div> <div v-if="previewVisible" class="preview-modal" @click="closePreview"> <img :src="selectedImage" alt="Preview"> </div> <!-- 免责声明: --> <div class="disclaimer" v-if="newsDetail.fromurl"> <p>原文链接:{{ newsDetail.fromurl }}</p> <p>[免责声明]本文来源于网络转载,仅供学习交流使用,不构成商业目的。 版权归原作者所有,如涉及作品内容,版权和其他问题,请在30日与本网联系,我们将第一时间处理。</p> </div> <div v-if="articleChoice"> <!-- 投票 start ----------------------------------------> <div class="index_3_box_vote" v-if="articleChoice"> <div class="voteTitle">投票区</div> <div class="inquire"> <p v-if="voteList.length > 0">{{ voteList[0].survey_name }}</p> <div class="radioBox"> <!--投票选项--> <div v-if="!isDisabled"> <div class="radio" v-if="isRadio"> <el-radio-group v-model="radio1" @change="handleRadioChange"> <el-radio v-for="item in voteList" :key="item.id" :value="item.id" size="large"> <span v-if="item.is_other == 0">{{ item.choice_name }}</span> <span v-else>其他</span> </el-radio> </el-radio-group> <el-input v-if="showUserChoice" v-model="userChoice" :rows="2" type="textarea" resize="none" placeholder="请输入.." /> </div> <div class="checkInputBox" v-else> <el-checkbox-group v-model="check1" @change="handleCheckboxChange"> <span v-for="item in voteList" :key="item.id"> <span v-if="item.is_other == 0"> <el-checkbox size="large" :label="item.choice_name" :value="item.id" /> </span> <span v-else> <el-checkbox size="large" label="其他" :value="item.id" /> </span> </span> </el-checkbox-group> <el-input v-if="showUserChoice" v-model="userChoice" :rows="2" type="textarea" resize="none" placeholder="请输入.." /> </div> </div> <!--投票结果--> <div class="inquireData" v-else> <div v-for="item in websiteSurveyData.data" :key="item.id"> <div class="inquireDataItem active" v-if="item.status == 1"> <div class="inquireDataItemTitle"> <span v-if="item.choice_name == ''">其他</span> <span v-else>{{ item.choice_name }}</span> </div> <div class="inquireDataItemNum">{{ item.results }}票</div> </div> <div class="inquireDataItem" v-else> <div class="inquireDataItemTitle"> <span v-if="item.choice_name == ''">其他</span> <span v-else>{{ item.choice_name }}</span> </div> <div class="inquireDataItemNum">{{ item.results }}票</div> </div> </div> </div> </div> <div class="btn"> <button class="voting" @click="addWebsiteSurvey" :disabled="isDisabled" v-if="!isDisabled">投票</button> </div> </div> </div> <!-- 投票 end ----------------------------------------> </div> </div> <div class="innerRight"> <!-- 热点资讯1 --> <div class="hotList1"> <DetailHotNews></DetailHotNews> </div> <!-- 热点资讯2 --> <div class="hotList2"> <DetailHotNews2></DetailHotNews2> </div> </div> </div> </div> <!-- 广告2 --> <HomeAdvertising :imgurl="adImg2"></HomeAdvertising> <!-- 页面底部 --> <HomeFoot1></HomeFoot1> </template> <script setup> //1.页面依赖 start ----------------------------------------> import { onMounted } from 'vue' import { ElBreadcrumb, ElBreadcrumbItem, ElRadio, ElRadioGroup, ElMessage, ElCheckboxGroup, ElCheckbox, ElInput } from 'element-plus' import { ArrowRight } from '@element-plus/icons-vue' //1.1 获得跳转过来的id const route = useRoute(); //获得详情id const articleId = parseInt(route.params.id); //获得该页面的id //获得当前的完整路径 const fullPath = route.path; //拆分,取出来中间这一段,然后提取数字部分 const segments = fullPath.split('/'); const targetSegment = segments[1]; // const numberPart = targetSegment.match(/\d+$/)?.[0]; // let routeId = 20 //排除路径错误可以打开这个 // const routeId = numberPart; let routeId; //通过导航路径反向查询导航id const getRouteId = await requestDataPromise('/web/getWebsiteRoute', { method: 'GET', query: { 'pinyin': targetSegment, }, }); if (getRouteId.code == 200) { routeId = getRouteId.data.category_id } else { console.log("SSR waring ---------- SSR waring ---------- SSR waring ---------->") console.log("错误位置:通过url路径查询导航池id") console.log("后端错误反馈:", getRouteId.message) console.log("SSR waring ---------- SSR waring ---------- SSR waring ---------->") } //1.2 获得父级栏目的名称、id const parent_name = ref([]); const parent_id = ref([]); const parent_pinyin = ref(""); const parent_children_count = ref(0) let getParentNav = async () => { const listData = await requestDataPromise('/web/getOneWebsiteCategory', { method: 'GET', query: { 'catid': routeId }, }); console.log("获取父级栏目数据") console.log(listData) if (listData.code == 200) { console.log(listData.data); parent_name.value = listData.data.alias; parent_id.value = listData.data.parent_id; parent_pinyin.value = listData.data.aLIas_pinyin; parent_children_count = listData.data.children_coun; } else { console.log("SSR waring ---------- SSR waring ---------- SSR waring ---------->") console.log("错误位置:获取面包屑导航") console.log("后端错误反馈:", listData.message) console.log("SSR waring ---------- SSR waring ---------- SSR waring ---------->") } } //获得父级栏目详情 getParentNav(); //1.页面依赖 end ----------------------------------------> //2.页面数据 start ----------------------------------------> //2.1 资讯详情 const newsDetail = ref({}) const routeNewsTtitle = ref(""); //2.2 发布日期 const time = ref(""); //2.3 路径 const routLevelTitle = ref(""); const routLevelId = ref(""); //是否展示投票 const articleChoice = ref(false); //2.4获取详情 async function getPageData() { const mkdata = await requestDataPromise('/web/selectWebsiteArticleInfo', { method: 'GET', query: { 'articleid': articleId }, }); if (mkdata.code == 200) { //判断是否显示投票 if (mkdata.data.is_survey == 1) { console.log("本篇文章含有投票!") articleChoice.value = true; getVoteList(); } //获取内容 newsDetail.value = mkdata.data; //获取路径 routLevelTitle.value = newsDetail.value.cat_name; routLevelId.value = newsDetail.value.category_id; //获取发布时间 time.value = newsDetail.value.updated_at.split(' ')[0]; //修正标题长度 if (newsDetail.value.title.length >= 20) { routeNewsTtitle.value = newsDetail.value.title.substr(0, 20) + "..."; } else { routeNewsTtitle.value = newsDetail.value.title } } else { console.log("SSR waring ---------- SSR waring ---------- SSR waring ---------->") console.log("错误位置:获取详情内容") console.log("后端错误反馈:", mkdata.message) console.log("SSR waring ---------- SSR waring ---------- SSR waring ---------->") } } getPageData(); //2.5 获得广告 //广告列表 let adImg1 = ref([]); let adImg2 = ref([]); onMounted(async () => { const { $webUrl, $CwebUrl } = useNuxtApp(); //广告1 let url = `${$webUrl}/web/getWebsiteAdvertisement?ad_tag=xcw_detail_0001` const responseAd1 = await fetch(url, { headers: { 'Content-Type': 'application/json', 'Userurl': $CwebUrl, 'Origin': $CwebUrl } }); const resultAd1 = await responseAd1.json(); adImg1.value = resultAd1.data[0]; //广告2 let url2 = `${$webUrl}/web/getWebsiteAdvertisement?ad_tag=xcw_detail_0002` const responseAd2 = await fetch(url2, { headers: { 'Content-Type': 'application/json', 'Userurl': $CwebUrl, 'Origin': $CwebUrl } }); const resultAd2 = await responseAd2.json(); adImg2.value = resultAd2.data[0]; }) //2.页面数据 end ----------------------------------------> //3.设置seo信息 start----------------------------------------> //3.1 设置seo信息 const setData = await requestDataPromise('/web/selectWebsiteArticleInfo', { method: 'GET', query: { 'articleid': articleId }, }); if (setData.code == 200) { let seoTitle = setData.data.title; let seoDescription = setData.data.introduce; let seoKeywords = setData.data.keyword; let seoSuffix = setData.data.suffix; let seoName = setData.data.website_name; useSeoMeta({ title: seoTitle + "_" + seoName + "_" + seoSuffix, meta: [ { name: 'description', content: seoDescription + "_" + seoName + "_" + seoSuffix, tagPriority: 10 }, { name: 'keywords', content: seoKeywords + "_" + seoName + "_" + seoSuffix, tagPriority: 10 } ] }); } else { console.log("SSR waring ---------- SSR waring ---------- SSR waring ---------->") console.log("错误位置:设置详情页面SEO数据") console.log("后端错误反馈:", setData.message) console.log("SSR waring ---------- SSR waring ---------- SSR waring ---------->") } //3.设置seo信息 end----------------------------------------> //4.投票 start----------------------------------------> const radio1 = ref(''); //单选 const check1 = ref([]); //多选 const isDisabled = ref(false);//是否禁用提交按钮 const isRadio = ref(true);//是否渲染单选 const userSurId = ref('');//投票属于哪一篇文章 const userChoice = ref('');//用于判断用户选择了其他选项以后,输入的值 const userIsChoice = ref('');//用于判断其他选项目前是什么值 const showUserChoice = ref(false);//是否显示其他输入框 const websiteSurveyData = ref([]);//投票结果 //3.2获得投票列表 let voteList = ref([]); async function getVoteList() { const voteData = await requestHome('/web/getWebsiteSurvey', { method: 'GET', query: { 'art_id': articleId } }); console.log(778899) console.log('778899', voteData) if (voteData.code == 200) { voteList.value = voteData.data; console.log(voteList.value) //判断显示单选还是多选 //survey_type 0是单选 1是多选 if (voteData.data[0].survey_type == 0) { isRadio.value = true; console.log("1111") } else { isRadio.value = false; } //把最后一个的值拿出来 用于判断用户是否选择了其他 for (let item of voteData.data) { //如果含有其他 if (item.is_other == 1) { userIsChoice.value = item.id; } } //用户投票属于哪一篇文章 userSurId.value = voteData.data[0].sur_id; } else { console.log("SSR waring ---------- SSR waring ---------- SSR waring ---------->") console.log("错误位置:首页投票") console.log("后端错误反馈:", voteData.message) console.log("SSR waring ---------- SSR waring ---------- SSR waring ---------->") } } //3.2当用户选择了选项,判断是否展示其他输入框 const handleRadioChange = (value) => { console.log('11111', value, userIsChoice.value); if (value == userIsChoice.value) { showUserChoice.value = true; } else { showUserChoice.value = false; } } const handleCheckboxChange = (value) => { if (value.includes(userIsChoice.value)) { showUserChoice.value = true; } else { showUserChoice.value = false; } } //3.2发起投票 async function addWebsiteSurvey() { //判断当前是单选还是多选 console.log(isRadio.value) if (isRadio.value) { console.log("用户单选!") if (radio1.value != '') { //先判断一下是否使用了其他选项 if (showUserChoice.value) { if (userChoice.value != '') { //文章id // console.log(userSurId.value) // 用户输入的值 // console.log(userChoice.value) //如果使用了其他,其他的选项需要增加进去 const ChoiceData = await requestHome('/web/addWebsiteSurveyOption', { method: 'GET', query: { 'sur_id': userSurId.value,//投票的新闻id 'choice_name': userChoice.value,//投票的选项id } }); if (ChoiceData.code == 200) { //提交完其他选项以后,再正式发起投票 const mkData = await requestHome('/web/addWebsiteSurveyVote', { method: 'GET', query: { 'sur_id': userSurId.value, 'choice_id': ChoiceData.data } }); if (mkData.code == 200) { ElMessage.success('投票成功!') //把投票结果显示到页面上 禁用投票按钮 isDisabled.value = true; websiteSurveyData.value = mkData.data; //遍历一下,把用户选中的那个设置status为1 let data = mkData.data; //遍历一下,把用户选中的那个设置status为1 for (let item of data.data) { for (let i of data.choice) { if (item.id == i) { console.log(item.id) item.status = 1; } } } websiteSurveyData.value = data; } else { ElMessage.error(mkData.message) } } else { ElMessage.error('其他投票失败!') } } else { ElMessage.error('请输入选项内容!') } } else { console.log('111', userSurId.value); console.log('222', radio1.value); //如果没选择其他,直接提交选择的内容 const mkData = await requestHome('/web/addWebsiteSurveyVote', { method: 'GET', query: { 'sur_id': userSurId.value, 'choice_id': radio1.value } }); if (mkData.code == 200) { ElMessage.success('投票成功!') //把投票结果显示到页面上 禁用投票按钮 isDisabled.value = true; let data = mkData.data; //遍历一下,把用户选中的那个设置status为1 for (let item of data.data) { for (let i of data.choice) { if (item.id == i) { item.status = 1; } } } websiteSurveyData.value = data; } else { ElMessage.error('投票失败!') } } } else { ElMessage.error('请选择一个选项') } } else { console.log("多选!") //多选 if (check1.value != []) { //先判断一下是否使用了其他选项 if (showUserChoice.value) { if (userChoice.value != '') { //判断用户是否只选择了一个其他 if (check1.value.length == 1) { const ChoiceData = await requestDataPromise('/web/addWebsiteSurveyOption', { method: 'GET', query: { 'sur_id': userSurId.value,//投票的新闻id 'choice_name': userChoice.value,//用户输入的其他选项文字 } }); if (ChoiceData.code == 200) { //提交完其他选项以后,再正式发起投票 const mkData = await requestDataPromise('/web/addWebsiteSurveyVote', { method: 'GET', query: { 'sur_id': userSurId.value, 'choice_id': ChoiceData.data } }); if (mkData.code == 200) { ElMessage.success('投票成功!') //把投票结果显示到页面上 禁用投票按钮 isDisabled.value = true; websiteSurveyData.value = mkData.data; //遍历一下,把用户选中的那个设置status为1 let data = mkData.data; //遍历一下,把用户选中的那个设置status为1 for (let item of data.data) { for (let i of data.choice) { if (item.id == i) { console.log(item.id) item.status = 1; } } } websiteSurveyData.value = data; } else { ElMessage.error(mkData.message) } } else { ElMessage.error('其他投票失败!') } } else { //用户选择了除了其他以外,还包括别的选项 const ChoiceData = await requestDataPromise('/web/addWebsiteSurveyOption', { method: 'GET', query: { 'sur_id': userSurId.value,//投票的新闻id 'choice_name': userChoice.value,//用户输入的其他选项文字 } }); if (ChoiceData.code == 200) { let data = check1.value; //找到多选的数组,把其他默认值给替换掉 for (let i = 0; i < data.length; i++) { if (data[i] == userIsChoice.value) { data[i] = ChoiceData.data; } } let jsonArray = JSON.stringify(data); //提交完其他选项以后,再正式发起投票 const mkData = await requestDataPromise('/web/addWebsiteSurveyVote', { method: 'GET', query: { 'sur_id': userSurId.value, 'choice_id': jsonArray } }); if (mkData.code == 200) { ElMessage.success('投票成功!') //把投票结果显示到页面上 禁用投票按钮 isDisabled.value = true; websiteSurveyData.value = mkData.data; //遍历一下,把用户选中的那个设置status为1 let data = mkData.data; //遍历一下,把用户选中的那个设置status为1 for (let item of data.data) { for (let i of data.choice) { if (item.id == i) { //console.log(item.id) item.status = 1; } } } websiteSurveyData.value = data; } else { ElMessage.error(mkData.message) } } else { ElMessage.error('其他投票失败!') } } } else { ElMessage.error('请输入选项内容!') } } else { let jsonArray = JSON.stringify(check1.value); //如果没选择其他,直接提交选择的内容 const mkData = await requestDataPromise('/web/addWebsiteSurveyVote', { method: 'GET', query: { 'sur_id': userSurId.value, 'choice_id': jsonArray } }); if (mkData.code == 200) { ElMessage.success('投票成功!') //把投票结果显示到页面上 禁用投票按钮 isDisabled.value = true; websiteSurveyData.value = mkData.data; //遍历一下,把用户选中的那个设置status为1 let data = mkData.data; //遍历一下,把用户选中的那个设置status为1 for (let item of data.data) { for (let i of data.choice) { if (item.id == i) { console.log(item.id) item.status = 1; } } } websiteSurveyData.value = data; } else { ElMessage.error('投票失败!') } } } else { ElMessage.error('请选择一个选项') } } } //4.投票 end----------------------------------------> //5.页面图片放大 start----------------------------------------> const previewVisible = ref(false) const selectedImage = ref(' ') const openPreview = (event) => { if (event.target.tagName === 'IMG') { selectedImage.value = event.target.src; previewVisible.value = true; } } const closePreview = () => { previewVisible.value = false; } //5.页面图片放大 end----------------------------------------> </script> <style lang="less" scoped> @import url('@/assets/css/detail.less'); </style>